
package com.lin.bean;

import lombok.Getter;
import lombok.ToString;

/**
 * GoF23 设计模式之一 --- 建造者模式
 * <p>
 *     将实体类的构造器定义为私有 且变量一般用 final 修饰, 提供 getter、toString方法
 *     在实体类内部创建一个静态内部类【如：Builder】, 在该类中提供“实体类变量的 setter”方法,
 *     但返回值是内部类【如：Builder】, 这样做可以实现链式调用, 然后提供一个方法用于创建对象【如：build】
 *     在该方法中调用实体类提供的私有构造器, 并返回实体类对象, 最后提供一个公开的静态方法获取建造者对象
 * </p>
 */

@Getter
@ToString
public class Product {
    private final String prodName;
    private final String prodType;
    private final String prodPrice;
    private final String prodColor;

    private Product(String prodName, String prodType, String prodPrice, String prodColor) {
        this.prodName = prodName;
        this.prodType = prodType;
        this.prodPrice = prodPrice;
        this.prodColor = prodColor;
    }
    // 对外暴露的构建器入口
    public static ProductBuilder builder() {
        return new ProductBuilder();
    }
    // 内部实现类
    public static class ProductBuilder{
        private String prodName;
        private String prodType;
        private String prodPrice;
        private String prodColor;
        public ProductBuilder prodName(String prodName) {
            this.prodName = prodName;
            return this;
        }
        public ProductBuilder prodType(String prodType) {
            this.prodType = prodType;
            return this;
        }
        public ProductBuilder prodPrice(String prodPrice) {
            this.prodPrice = prodPrice;
            return this;
        }
        public ProductBuilder prodColor(String prodColor) {
            this.prodColor = prodColor;
            return this;
        }
        public Product build() {
            return new Product(prodName, prodType, prodPrice, prodColor);
        }
    }
}
